package com.kexio.dynamic.config.service;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 动态配置服务接口
 * 
 * 提供配置的动态更新、监听和热加载功能
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface DynamicConfigService {

    /**
     * 获取字符串类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    String getStringValue(String key, String defaultValue);

    /**
     * 获取整数类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Integer getIntValue(String key, Integer defaultValue);

    /**
     * 获取布尔类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Boolean getBooleanValue(String key, Boolean defaultValue);

    /**
     * 获取长整型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Long getLongValue(String key, Long defaultValue);

    /**
     * 获取双精度类型配置值
     * 
     * @param key          配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    Double getDoubleValue(String key, Double defaultValue);

    /**
     * 获取JSON对象配置值
     * 
     * @param key   配置键
     * @param clazz 目标类型
     * @return 配置对象
     */
    <T> T getJsonValue(String key, Class<T> clazz);

    /**
     * 获取配置列表
     * 
     * @param key       配置键
     * @param separator 分隔符
     * @return 配置列表
     */
    List<String> getListValue(String key, String separator);

    /**
     * 动态更新配置
     * 
     * @param key   配置键
     * @param value 配置值
     * @return 更新操作的异步结果
     */
    CompletableFuture<Boolean> updateConfig(String key, String value);

    /**
     * 批量更新配置
     * 
     * @param configs 配置映射 (key -> value)
     * @return 更新操作的异步结果
     */
    CompletableFuture<Integer> updateConfigs(java.util.Map<String, String> configs);

    /**
     * 添加配置变更监听器
     * 
     * @param key      配置键
     * @param listener 监听器
     */
    void addConfigListener(String key, ConfigChangeListener listener);

    /**
     * 添加配置分组监听器
     * 
     * @param groupPattern 分组模式 (支持通配符)
     * @param listener     监听器
     */
    void addGroupListener(String groupPattern, ConfigChangeListener listener);

    /**
     * 移除配置监听器
     * 
     * @param key      配置键
     * @param listener 监听器
     */
    void removeConfigListener(String key, ConfigChangeListener listener);

    /**
     * 刷新指定配置
     * 
     * @param key 配置键
     */
    void refreshConfig(String key);

    /**
     * 刷新配置分组
     * 
     * @param group 配置分组
     */
    void refreshGroup(String group);

    /**
     * 刷新所有配置
     */
    void refreshAllConfigs();

    /**
     * 预热配置缓存
     * 
     * @param keys 配置键列表
     */
    void warmupCache(List<String> keys);

    /**
     * 获取配置的最后更新时间
     * 
     * @param key 配置键
     * @return 最后更新时间戳
     */
    Long getLastUpdateTime(String key);

    /**
     * 检查配置是否存在
     * 
     * @param key 配置键
     * @return 是否存在
     */
    boolean exists(String key);

    /**
     * 获取配置的原始值（未经过类型转换）
     * 
     * @param key 配置键
     * @return 原始配置值
     */
    String getRawValue(String key);

    /**
     * 获取配置的加密值
     * 
     * @param key 配置键
     * @return 加密后的配置值
     */
    String getEncryptedValue(String key);

    /**
     * 设置配置的加密状态
     * 
     * @param key       配置键
     * @param encrypted 是否加密
     * @return 是否成功
     */
    boolean setEncrypted(String key, boolean encrypted);
}
